#include "Paraboloide.hpp"

#include "BaseParaboloide.hpp"
#include "Plan.hpp"

#include "Utils/ATL.hpp"

using namespace std;

/**
 * Constructeur par défaut. Crée une instance dont le sommet est à
 * l'origine avec une transformation identité.
 */
Paraboloide::Paraboloide()
{
  Coord point( 0., 0., 0. );
  Vecteur axeX( 1., 0., 0. );
  Vecteur axeY( 0., 1., 0. );
  Vecteur axeZ( 0., 0., 1. );

  form[ 0 ] = new BaseParaboloide( point, axeX, axeY, axeZ,
				   1., 2. );
  form[ 1 ] = new Plan( axeZ, point + 10. * axeZ );

  op = inter;

  Nom = "Paraboloïde";

  double x( 10. * ( 1. + 1. / puissance< 2u >( 1. / 2. ) ) );
  PseudoCentre = point + x * axeZ;
  PseudoRayon = sqrt( puissance< 2u >( 10. ) + puissance< 2u >( 10. - x ) );
}

/**
 * Constructeur standard, permettant d'initialiser toutes les
 * variables.
 *
 * @param sommet somme du paraboloïde.
 * @param axeX axe x des coordonées locales.
 * @param axeY axe y des coordonées locales.
 * @param axeZ axe z des coordonées locales.
 * @param echelleX facteur d'échelle selon l'axe x local.
 * @param echelleY facteur d'échelle selon l'axe y local.
 * @param hauteur hauteur du paraboloïde dans le sens positif
 * de l'axe z local.
 */
Paraboloide::Paraboloide( const Coord& sommet,
			  const Vecteur& axeX, const Vecteur& axeY,
			  const Vecteur& axeZ,
			  const double& echelleX, const double& echelleY,
			  const double& hauteur )
{
  form[ 0 ] = new BaseParaboloide( sommet, axeX, axeY, axeZ,
				   echelleX, echelleY );
  form[ 1 ] = new Plan( axeZ, sommet + hauteur * axeZ );

  op = inter;

  Nom = "Paraboloïde";

  double x( hauteur * ( 1. + 1. / puissance< 2u >( min( echelleX,
							echelleY ) ) ) / 2. );

  PseudoCentre = sommet + axeZ * x;
  PseudoRayon = 2. *sqrt( puissance< 2u >( hauteur / min( echelleX, echelleY ) ) +
		      puissance< 2u >( hauteur - x ) );
}

// Paraboloide::Paraboloide( const Paraboloide& par )
//   : Forme( par ), Sommet( par.sommet() ),
//     AxeX( par.axeX() ), AxeY( par.axeY() ), AxeZ( par.axeZ() ),
//     EchelleX( par.echelleX() ), EchelleY( par.echelleY() ), Hauteur( par.hauteur() )
// {
//   Base = Plan( Sommet + Hauteur * AxeZ, AxeZ );

//   ReduitCoordonnes = MatriceGL3( 1. / EchelleX, 1. / EchelleY, 1. );

//   m_solveur = new Solveur();
// }

/**
 * Le destructeur n'a rien de spécial à faire.
 */
Paraboloide::~Paraboloide()
{}
